This is a little outside my area but I did find the following link which suggests that you are encountering a known defect with .net 2.0.
I copied the following from the suggested work-around from microsoft:
The problem will occur when marshaling
an object by value between two
appdomains in the same process where
the type of the instance is generic,
the generic template type is defined
in mscorlib, one or more of its
instantiating types is not defined in
mscorlib and multi-domain loader
optimization has been enabled in one
domain but not the other.
Unfortunately this bug was discovered
too late and didn't make the bar for
the V2.0 product. There are some
workarounds however:
This bug is specific to an optimized
version of the in-process,
cross-appdomain remoting channel and
therefore can be avoided by switching
this optimization off for the process.
This can be achieved either by setting
the the following environment variable
in the command window where the test
will be executed:
set complus_UseNewCrossDomainRemoting=0
Or by setting the
HKEY_CURRENT_USER\Software\Microsoft.NETFramework\UseNewCrossDomainRemoting
registry value (a DWORD) to 0 (or the
version in HKEY_LOCAL_MACHINE).
These are a bit heavyweight, but it's
also possible to fool the optimized
path into avoiding just the specific
call that transfers the problematic
object. To do this add a dummy out
parameter to the call (for various
technical reasons the optimized path
doesn't implement out parameters yet).
You can also avoid using an mscorlib
defined generic type. In the repro
case presented this is simple enough
since you can just subtype List:
[Serializable]
public class MyList<T> : List<T>
{
}
(Just replace all uses of List with
MyList).
Finally, the problem shouldn't occur
if both appdomains are using the
multi-domain optimization. You can't
set the default domain's loader
optimization after you're already
running it but you can either set it
externally (I believe via the
unmanaged hosting API or a config
file, though I'm not an expert in
either, sorry) or by creating a new
domain (with multi-domain opt) within
your code and transferring control to
it (via a call on an MBRO object in
that domain).
Sorry if you've already found this article in your searching but I didn't see it offered here as a solution.