Por lo general, una buena forma es tener conocimiento sobre las reglas de contraseña aplicadas a un sistema. Digamos que un servicio requiere una contraseña legítima para tener entre 6 y 10 caracteres alfanuméricos con al menos un número. Puedes controlar las reglas registrándote en ese sistema (si es posible) o aplicar algún conocimiento de dominio de este sistema.
Por lo tanto, sin este conocimiento, de hecho no hay forma de generar diccionarios de manera eficiente.
Si puede eliminar 500.000.000 de contraseñas que son < 6 o > 10 o que no tienen ningún número, ya ha ganado. Convertir todo a bajo lenguaje no ayuda automáticamente cuando el sistema en cuestión no permite barras invertidas, por ejemplo.
(Por otra parte, como administrador: ocultar esas reglas del usuario legítimo realmente las molestará)
Pero hay una forma de generar una lista completa, ni siquiera necesitas listas de palabras para eso, es un simple ataque de fuerza bruta en todo el espacio de caracteres que comienza con 1 hasta cierto límite, digamos una contraseña límite de 256. Luego tendrá la "lista de palabras" garantizada. La cantidad de datos de basura es, por supuesto, enorme, pero podría ser tan enorme como usar el lenguaje de leet en un servidor que no permite esos caracteres.