This cannot work, type identity in .NET prevents this. A strong DLL Hell countermeasure. Type identity of a type isn't just its namespace name and type name but also the assembly it came from. So you have two distinctive Data.Model.Viper types and they have no relationship with each other at all. Trying to cast just produces an InvalidCastException.
You must use a common type, one that's declared in a separate assembly that is referenced both by your main code and your C++/CLI assembly.