Используйте отражение, чтобы посмотреть на поля объекта и используйте его для заполнения нового экземпляра.
Это делает некоторые предположения о существовании конструктора, который не принимает аргументов.
Type t = typeof(typeToClone);
var fields = t.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
var copy = Activator.CreateInstance(t);
for(int i = 0; i < fields.Length; i++)
fields[i].SetValue(copy, fields[i].GetValue(existing));