Any sort of non-dictionary-based board generator would run the risk of containing little to no actual words.
To address this, this fairly simple (at least on the high level) approach comes to mind:
Have a dictionary of allowable words.
Repeatedly randomly pick an unpicked word from the dictionary (if you're going to pick a large percentage of the words, shuffling would help you do this efficiently, otherwise you can just maintain a set of the already-picked words - this is assuming you actually don't want duplicate words on the same board), and do the following with that word:
Pick a random open cell on the board. This would be the location of the first letter of the word.
Repeatedly go in a random direction (to an open cell) for the next letter. If one of the neighbouring cells contains the next letter already, we could go to that cell instead. If you run into a scenario where no directions work, backtrack and pick a different direction to a previous letter.
You could perhaps eliminate cells from being repicked if you picked it and couldn't manage to form a word. You could also eliminate all cells you visited during the process to assign cells for that word. Although this is not perfect - if you couldn't fit a 10-letter word, that doesn't mean a 3-letter word won't work.
You'd obviously stop either when the board is mostly full or you have some number of words on the board already.
This still leaves a lot open to the implementation, but it's just meant to be a high-level idea.