Bueno básicamente deberías entonces armar una base de datos de las palabras que vas a querer poner en la sopa de letras y luego lo que se me ocurre es que armes una clase celda que solo pueda contener una letra.
Luego de eso deberías armar una clase tablero en la cual definas que cantidad de celdas va a tener de alto y de ancho.
Las celdas van a tener que tener unas propiedades especiales: por ejemplo
1) que ubicación tiene dentro del tablero
2) cuantas celdas se pueden ubicar en cada una de las direcciones... recorda que las sopas usan los lados arriba, abajo, derecha e izquierda y las diagonales.
3) si la celda esta siendo utilizada por una o mas palabras deberías almacenar cual es la posición de la letra y a que palabra hace referencia.
Te diría que primero que nada tomes lapiz y papel y escribas una lógica para un tablero de 10 x 10
1) palabras que no se toquen y solo horizontales (escritas al derecho y al revés)
2) palabras que no se toquen y solo verticales (escritas al derecho y al revés)
3) palabras que no se toquen y solo diagonal arriba (escritas al derecho y al revés)
4) palabras que no se toquen y solo diagonal abajo (escritas al derecho y al revés)
5) palabras que no se toquen escritas en cualquier ubicación.
Luego de eso agrega la lógica para cuando se toquen.
Finalmente debería haber un enlace entre cada letra de cada una de las palabras que están en la sopa, por si el usuario quiere una ayuda, o vos la queres resaltar o cambiar el tipo de letra o el fondo o algo por el estilo.
Una vez que la lógica te funciona en el papel, recién ahí empeza a programar y no te preocupes por como se ve, pues eso se resuelve al final.