I'm not sure how drag/drop would be confusing. In any case, that is the requirement that I must code to.
After much thought and research, I stumbled upon an idea: I went ahead and implemented standard drag/drop TO my DataGridView, and debugged through the app to see what kind of data was being submitted. This led me to the OleDataObject class, which can be implemented simply as System.Windows.Forms.DataObject. Now, the core of the code (which I've simplified for illustration) becomes...
using System;
using System.Collections.Generic;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
String strTmpFileName = Path.GetTempFileName();
strTmpFileName = Path.ChangeExtension(strTmpFileName, doc.DocType);
DataObject dragObject = new System.Windows.Forms.DataObject();
StringCollection filePaths = new StringCollection();
filePaths.Add(strTmpFileName);
dragObject.SetFileDropList(filePaths);
This code sets a filepath into the drag object, which can then be passed to the DoDragDrop function. Make sure the file exists before a drag operation takes place. I do this by writing a TMP file as soon as the user selects a row in my DataGridView.