You can do it with VB.NET or C#, but with great difficulty. There is a ton of COM interop you have to setup in your code and a bunch of structures you have to create and marshal properly. On top of that, there's a bit of an issue with using managed code to write Shell extensions. You can read about that
here[
^]. It amy force you to write this in C++ instead.
Beyond that, try
these[
^] examples. Most of which is going to be C#, but can be converted to VB.NET with a little work.