There are a couple of challenges in re-writing a C++ plug-in that utilizes custom user data in C#.
First, your user data is owned by a plug-in, and this ownership is based on the UUID of the plug-in that wrote the data. Thus, your replacement C# plug-in will need to use the same UUID as your C++ plug-in.
The biggest challenge is to be able read the user data, written in C++, in exactly the same manner, bit by bit, in C#.
An alternative approach is to refactor your C++ plug-in a bit so your C# can access the user data.
The following sample demonstrates how to share user data between 2 (or more) C++ plug-ins. This is done by having all of the user data reading and writing code in a Rhino-dependent DLL.
And here is a solution that demonstrates how to have both a C++ and a C# plug-in call the same functions.
With these two samples, you should be able to see how you can refactor your C++ plug-in so it just reads the old user data. This data could be read by your C# plug-in. And, the C# plug-in would write the new user data format, thus migrating away from the old mechanism over time.