Create shapes in a console
I find neither approach is good. 

What's wrong with the switch?


It needs to be modified with each change and even only if you want to do something with only one shape.
It's bound to key-codes.
You cannot test it.


What's wrong with reflection?


Reflection is usually the last resort solution. I think you are not at a dead end yet.
The way you implemented it is very unsafe because you use the FullName and Contains. What if a Rectangle would be in a namespace like CirclesAndSqures and you are looking for a circle? You'll find something that is not a circle but a rectangle only because its namespace has the name circle in it.
You cannot test it.




Instead I suggest the following. Let's say you have an abstract Shape 

abstract class Shape { }


and some concrete types

class Circle : Shape { }


For each type you can write a factory that implements a common interface:

interface IShapeFactory
{
    Shape CreateShape();
}


Each factory of course can depend on other services like reading from the console etc.

class CircleFactory : IShapeFactory 
{
    public Shape CreateShape() 
    {
        // read params etc
        return new Circle();
    }
}


Finally you create a dictionary with all the shape factories

var shapeFactories = new Dictionary&lt;string, IShapeFactory&gt;(StringComparer.OrdinalIgnoreCase)
{
    [nameof(Circle)] = new CircleFactory()
};

var shapeName = // read shape name...

if (shapeFactories.TryGetValue(shapeName, out IShapeFactory shapeFactory))
{
    var shape = shapeFactory.CreateShape();
}


You can now add as many shapes and factories as you want without touching any other shapes or common code.