1) is okay for these interface types, they were crafted to always inherit the previous version. So the v-table of ICorProfilerInfo4 includes all of the methods of the 3 previous versions. This is certainly not necessarily always the case for COM interfaces but works here. It is dangerous, calling an ICorProfilerInfo4 method when you obtained an ICorProfilerInfo3 interface will crash your program. You get no help from the compiler to keep you out of trouble.
2) there's no IS operator in C++, you can do it in COM by calling QueryInterface() again. Or you could just set a variable that indicates which version of the interface you obtained. Using QI avoids the crash when you get the version checking wrong and does allow the compiler to help you get the code right.
I would recommend you first catalogue the profiler functions you actually need. You're in danger of adding too much flexibility, the kind that make you write code you'll never use and ship a program that isn't fully tested. The differences between FunctionEnter2 and FunctionEnter3 are not subtle, both will however work just fine and you're pretty unlikely to notice the optimization.