There are many possible ways. I'd consider building a tree where each leaf and branch corresponds to one character. e. g. if you have the words "dog", "donut" and "day", your tree would look something like this:
[d]
/ \
[a] [o]
/ / \
[y] [n] [g]
/
[u]
/
[t]
You'll need to consider how to set up the data structure for the nodes: obviously each can have up to 26 children (assuming you're just using a-z, no numbers, no special characters or accents), and you somehow need to mark those nodes that are actual words even tough they branch into more words (e. g. "do" is a valid word but branches into "dog" and "donut"):
When you want to print a list of valid words starting with "do", then you only need to traverse the tree to the leaf [d]-[o] and then traverse all children.
Note that this solution may be more complex to implement than solution 1, and adding a word to the dictionary may be slower with this solution. but looking up a range of words can be very fast if done right.