I have also been trying to re-assemble the C# code (tried a few different decompilers).
I found that <PrivateImplementationDetails> usually relates to a switch on a string. switch (string) .. case "blahblah" for example.
Dot net seems to store those into a dictionary, then uses the lookup for the switch, and the case is the index.
So i managed to revert that code back to orignal form.
List`1 I think used to be a for each loop, but havent figured out how to reconstruct those yet.
There are lots of other things which I have no idea how to fix

for example...
while (TV2Engine.ThreadInfo[,].Address(i1, i2).ThreadID != 0)
{
if (!arrThreadInfo.ContainsKey(TV2Engine.ThreadInfo[,].Address(i1, i2).ThreadID))
{
TV2Engine.ThreadInfo[,].Address(i1, i2).ThreadID.Add("", string.Concat("{0:X}", string.Format(arrThreadInfo, TV2Engine.ThreadInfo[,].Address(i1, i2).ThreadID), ": "));
}
i3 = 0;
while (TV2Engine.ThreadInfo[,].Address(i1 + 1, i3).ThreadID != 0)
{
if (arrThreadInfo == TV2Engine.ThreadInfo[,].Address(i1 + 1, i3).ThreadID)
{
TV2Engine.ThreadInfo[,].Address(i1, i2).ThreadID[hashtable] = string.Concat((arrThreadInfo[TV2Engine.ThreadInfo[,].Address(i1, i2).ThreadID] as string), (((int)(TV2Engine.ThreadInfo[,].Address(i1 + 1, i3).UserTime + (arrThreadInfo - TV2Engine.ThreadInfo[,].Address(i1, i2).UserTime)))) / 100000, "% ");
}
i3++;
if (i3 >= 256)
{
break;
}
}
It does not like the [,] fields.
Any help would be appriciated.
Thanks
Micl