I think you may have misunderstood generics. Another word that could be used is "template" but that is avoided because it is used for more advanced things in C++.
The following will create a generic class of a currently undefined type T.
public class Class2<T>
{
public T Property3 { get; set; }
}
To use this you need to specify the missing type:
var x = new Class2<int>();
This will create an object that has a property Property3 that is of type int.
... or ...
var y = new Class2<string>();
This will create an object that has a property Property3 that is of type string.
From your question I believe you actually want a type where you can assign any type to it at runtime, but this is not what generics provide.