Well, I looked at your code and saw quite some issues (so I did not run it). here are some of them:
1. There is no need to use COM API objects in it, especially the "GetAcadApplication()" method does not make any sense at all: your program only runs when AutoCAD is running and you loaded the DLL with NETLOAD. There is no chance for your code to "Fail to communicate with AutoCAD" when the code start running in AutoCAD.
2. In the command method, you show the form with this
vpSelectdialog.Show()
which is not recommended. Instead, you'd better use Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog()/ShowModelessDailog(). In your case, since the program works against current active drawing, not multiple drawings, using ShowModalDialog() would be preferred.
3. In the class VPFucntions' ListCurrVports() method (BTW, the method being Shared is preferred, in your case), you unnecessaarily placed current document (MdiActiveDocument), WorkingDatabase and current Layout in a Using block and call Dispose() method on them. Your code does not create/instantiate those objects, thus your code should not dispose them. Sometimes, calling Dispose() on live AutoCAD objects may be harmless, but you never know. It depends on how Autodesk implemented the Dispose() method, harm or harmless is a wild guess. The point is you SHOULD not dispose these objects.
4. In the same method, you start a Transaction, but never finish it by either calling Commit() or Abort(), your code simply go straightly to Transaction.Dispose(). This may leave some opened objects in an unstable status. Again, it depends on how Transaction.Dispose() is implemented, we as outsider can only guess that without Commit()/Abort() a transaction would be very bad thing to do. This could be the reason of the crash you described.
5. In the form's code behind, the VPSelect_Close(...) method, you instantiate a new VPDialogControl class, which is the command class. This is really not necessary. The correct way would be: the form shows as modal dialog; the form's close button does nothing but hide the form (that is, its DislogResult property being set to either OK or Cancel; then in the command method (opendialog()), after call ShowModalDialog(), you cal the DialogClosing(0 method (and remove the "GetAcadApplication()" part, you can use MdiDocument.Editor.SwitchToModel[Paper]Space(), instead of AcadDocument.MSpace=True).
Hope this help a little bit.