Interop between COM and C# (or any other managed language) makes heavy use of the VARIANT data type. Being a lover of first principles, I finally found a first-principles-ish page describing VARIANTs.
In the VS2005 help it's under Win32 and COM Development -> Component Development -> Automation -> SDK Documentation -> Data Types, Structures and Enumerations -> VARIANT. Apparently VARIANTs came into heavy use under Automation formerly known as OLE Automation, subsequently known as ActiveX. The basic idea being the programmatic manipulation of components (as opposed to visually manipulating them in their native application environment).
For a not-so-first-principles-ish, but still excellent, discussion of VARIANTs see the excellent, if old, series "Dr. GUI and COM Automation, Part 1" (and parts 2-4).