I think I finally understand the Drag/Drop classes for monomac, and have provided dragging.patch (for monomac) with the appropriate changes to appkit.cs.  In essence the messages that are sent to delegates that might respond to 'drag events' are sent an object that implements NSDraggingInfo.  NSDraggingInfo is a protocol, but implementing this as a [Model] does not work because this object is not created by clients, and the runtime cannot cast the actual object created by appkit to the C# class.
I think I finally understand the Drag/Drop classes for monomac, and have provided
dragging.patch (for monomac) with the appropriate changes to appkit.cs.  In essence
the messages that are sent to delegates that might respond to 'drag events' are
sent an object that implements NSDraggingInfo.  NSDraggingInfo is a protocol, but
implementing this as a [Model] does not work because this object is not created by
clients, and the runtime cannot cast the actual object created by appkit to the
C# class.

Drag and Drop Programming Topics for Cocoa mentions that the system
creates an undocumented NSDragDestination object which implements NSDraggingInfo.

Since the docs refer to NSDraggingInfo and not NSDragDestination, and since
NSDraggingInfo is a more descriptive name, it is used in appkit.cs, and the Name
attribute is used to register NSDraggingInfo to NSDragDestination.  I tested this
with NSDraggingDestination and NSBrowserDelegate, and all seems well.

It could be improved by privatizing the constructors for NSDraggingInfo.

PlayScriptRedux/monomac,dlech/monomac