Cómo refactorizar cambiar en diccionario / fábrica

Estoy intentando ejecutar una 'Receta' leída de un archivo de texto y analizada línea por línea para llamar dinámicamente una serie de métodos. Creo que necesito implementar una Factory después de hacer un poco de googlear, pero me faltan algunos detalles clave. Este es el ejemplo más cercano que tengo:

http://simpleprogrammer.com/2010/08/17/pulling-out-the-switch-its-time-for-a-whooping/

El siguiente código es un fragmento de lo que tenemos ahora.

    internal static void Run(int Thread_ID, List<StringBuilder> InstructionSet, List<double>[] Waveforms)
    {
        //Init
        List<double>[] Register = new List<double>[10];
        for (int i = 0; i < Waveforms.Length; i++) { Register[i] = new List<double>(Waveforms[i]); }
        for (int i = 0; i < Register.Length; i++) { if (Register[i] == null) { Register[i] = new List<double>(); } }

        //Run Recipe Steps
        foreach (var item in InstructionSet)
        {
            Step Op = Step.Parse(item.ToString());
            switch (Op.TaskName)
            {
                case "SimpleMovingAverage":
                    Register[Convert.ToInt32(Op.Args[0])] = Signal_Filters.SimpleMovingAverage(Register[Convert.ToInt32(Op.Args[1])], Convert.ToInt32(Op.Args[2]));
                    break;

                case "RollingSteppedStdDeviation":
                    Register[Convert.ToInt32(Op.Args[0])] = Signal_Filters.RollingSteppedStdDeviation(Register[Convert.ToInt32(Op.Args[1])], Convert.ToInt32(Op.Args[2]), Convert.ToInt32(Op.Args[3]));
                    break;

               //... etc. many, many methods to be called.
            }
        }
    }

... y debajo está la parte del ejemplo sobre la que tengo preguntas:

public static class MoveFactory
{
    private static Dictionary<string, Func<IMove>> moveMap = new Dictionary<string, Func<IMove>>()
    {
        {"Up", () => { return new UpMove(); }},
        {"Down", () => { return new DownMove(); }},
        {"Left", () => { return new LeftMove(); }}
        // ...
    };

    public static IMove CreateMoveFromName(string name)
    {
        return moveMap[name]();
    }
}

¿Puedo generar la lista de diccionarios automáticamente? De modo que cada vez que agrego una nueva clase que implementa mi interfaz de fábrica (mi equivalente a IMove), no tengo que actualizar mi diccionario o casi cualquier otra parte de mi código. ¿Quizás esto puede forzarse como parte de la interfaz?

En el código de ejemplo anterior, no lo veo pasar argumentos dentro y fuera. Mirando mi código, tengo datos que necesito para mutar progresivamente ... ¿Cómo haría esto usando una fábrica?

La fábrica debe ser segura para los subprocesos, ya que quiero pasar datos iniciales diferentes a varios trabajadores, cada uno de los cuales ejecuta su propia receta.

Respuestas a la pregunta(1)

Su respuesta a la pregunta