Well I found a work around. You guys are probably going to laugh at it, but that might motive someone who knows what they are doing to put out an example 
Since I can’t figure out a way to properly call maxscript methods via ObjectForScripting, I thought maybe if I can get the command stored in a real dotNet system object, then I can execute it via one of the events. Dirty, I know.
Here is some sample code:
clearListener()
try(destroydialog html_rol);catch()
rollout html_rol "dotNet HTML Interface" width:540 height:600
(
local url = "C:\\your\\path\\here\ est.html"
dotNetControl wb "System.Windows.Forms.WebBrowser" pos:[0,0] width:540 height:600 dotNetControl exec "System.Windows.Forms.Textbox" pos:[0,0] visible:false --hidden textbox that will hold commands passed from javascript
on html_rol open do
(
if doesFileExist url then
(
neturl = dotNetObject "System.Uri" ("file://" + url)
wb.Navigate neturl
wb.ObjectForScripting = exec
print exec
)
else
(
print url + " can't be found"
)
)
on exec TextChanged e do --once we get a command, execute it. Don't try this at home.
(
execute(exec.text)
)
)
createdialog html_rol
the html is the same pretty much as what they had on the msdn reference i linked to earlier:
<html><head>
<script>
function test(message) { alert('received: ' + message); }
</script>
</head>
<body>
<button onclick="window.external.text ='box()'">call client code from script code</button>
</body>
</html>