I think a plugin architecture would be a little overkill unless you're interested in versioning or deploying the sub-modules separately. You haven't shown the sub-modules (the actual solvers) but I'd probably define an interface for them and then use a `Dictionary` instead of the `switch` statement. Really, it's pretty minor, but I see a couple of advantages of the `Dictionary`:

- You go from three lines for a new definition to a single line; this will start to make a difference after 10 or so sub-modules since you'll fit on the same screen
- It makes explicit that this main method is solely for determining the sub-module; the switch statement leaves room for other code, so it needs to be scanned when reading the code
- Since the dictionary is explicitly data, it'd be easier to abstract out later if you wanted
- You may want to inject other components into your sub-modules (such as a logger, or an abstracted input/output routine) and having a single init routine will make that easier.

So, a quick implementation would be something like:

    interface ISolver {
        void Solve();
    }
  
    class EulerOne : ISolver {
    }


    static void Main(string[] args)
    {
        // Using a Func to allow a new copy and/or some custom init if needed
        Dictionary<int, Func<ISolver>> solvers = new Dictionary<int, Func<ISolver>>() {
           { 1, () => new EulerOne() },
           { 2, () => new EulerTwo() },
           { 3, () => new EulerThree() }
        };

        int eulerNumber;

        Console.WriteLine("Please enter the number of the Problem you want to solve.");

        while (!int.TryParse(Console.ReadLine(), out eulerNumber))
        {
           Console.WriteLine("Please enter a valid number.");
           Console.WriteLine();
           Console.WriteLine("Please enter the number of the Problem you want to solve.");
        }
    
        var solverBuilder = _solver[eulerNumber];
        var solver = solverBuilder();
        solver.Solve();

        return 0;
    }