As far as I know, one cannot copyright something based on "sweat of the brow" which basically excludes compilations. For example, it is perfectly legal to scan your competitor's white pages phone book and print and sell your own version.
I myself managed to find on the internet a pretty good text list of words for my own Boggle Cube word finder program I wrote. I am also going to use it for the Anagram Explorer program I am about to start. Would you like me to email it to you?
If you're truly interested in getting the "complete" list (but only up to 8-letter-long words) you should try to find a Scrabble or Boggle word list.
As for making the search go faster, using indexes and binary searches are both valid strategies. Do you know how to get started on this?
Let's say your word list is an array of strings, with 50,000 words in it. If you check to see whether a word starting with Z exists by stepping through the list from the start, it's going to take a while to find it.
You could build a quick index by scanning the list once and marking where each next letter starts in an array of Longs like lngMyIndex(1 to 26). When you want to look up "leapfrog" you would look to see where L starts and ends, at M, by inspecting lngMyIndex(12) and (13) which could for example be 23,000 and 25,000, cutting your search down to 2,000 words instead of 50,000.
L is the 12th letter of the alphabet and you can derive it by doing Asc("l"

- Asc("a"

+ 1, which collapses to Asc("l"

- 96. Note this only works for lower case, so either do Asc(LCase("L"

) - 96 or do Asc(UCase("l"

) - 64.
You will of course be replacing my "L" or "l" with Left(strWordToSearchFor, 1). Asc only returns the ascii value of the first character, but I think it is good programming practice to only pass it the string you want because you can get weird results with Unicode and it's good to start good habits now.
To do a binary search, don't check each word for equality in a row, rather, start in the middle of the range. In the example above you might start at 24,000... you don't get a match, but you can also test for which is greater. Let's say "leapfrog" is less than word 24,000 in your wordlist. Now you have a new range that you know leapfrog will be in, if it is in your list: 23,000-24,000. You can then check at 23,500. I will leave the details of implementing this up to you.
Since I wanted speed, I actually created 3 indexes, a one-, two-, and three-letter index of letters starting words. Note that you need to handle cases where an index does not point into the dictionary (for example, there are no words in any English dictionary which start with "qzj"

.
-E
-----------------
I did make my own dictionary class for my unfinished Boggle program and just got started on rewriting it today. (It solves cubes you enter manually, but doesn't look pretty and doesn't know how to "roll" the dice to actually play the game.) My class will be able to load word lists from at least a text file to begin with, and will supply word lookups, anagrams, and other functions (and yes I will do my best to make it work fast with indexes).
If and when I finish it, I will probably be making it into a DLL. would you like a copy? I'd be happy to supply it. I will be releasing both my Boggle (tm) word finder and my Anagram Explorer for free, just to get my name out there as a programmer and also for the experience.