Hola, no quiero ser crítico "porque sí", en el código se ven cosas muy bien hechas, manejo de instrucciones y sentencias que utilizas bien, y otras cosas que no están bien hechas (al menos desde mi punto de vista). En concreto:
Sigues sin tener un diseño orientado a objetos. Tienes una única clase que lo hace todo, incluido el mostrar mensajes por consola. Por contra, la clase con el método main no hace nada. Esto denota que no estás haciendo un buen diseño orientado a objetos posiblemente porque te falta estudiar e interiorizar cómo se trabaja la orientación a objetos.
La otra cosa que llama la atención a cualquier programador experimentado y que podemos decir que está mal concebida es el uso de switch con una ristra de sentencias case detrás:
case 65:
letras[m] = "A";
break;
case 66:
letras[m] = "B";
break;
...
...
...
Cuando tienes case 65, case 66, case 67 ... y así sucesivamente esto sugiere un mal diseño del código: se ve que sería más adecuado usar un bucle que usar una ristra de cases. Para usar un bucle tienes que pensar cómo hacerlo, posiblemente debas usar instrucciones auxiliares que permiten obtener el valor numérico asociado a una letra y al revés (como Encoding.ASCII.GetBytes(cadena); ó (int)c donde c es un carácter)
Al ver esa ristra de cases, lo que induce a pensar es que las 50 líneas que has empleado se podrían reducir a 10 si usas un bucle y las instrucciones adecuadas. No te hablo que siempre sea así, habrá casos en que no sea posible, pero en general ver algo así indica un fallo en la concepción del código.
Salu2!