For anyone bumping into this problem, the newer versions of Newtonsoft JSON have an overload that takes a type as a second argument and where you can pass a dynamic value without jumping through any hoops: DeserializeObject(string value, Type type);.
var myObj = JsonConvert.DeserializeObject(string serializedObject, Type deserializedType);