I don't know about System.Diagnostics, but from what I know the pdb format is universal, you parse it the same way for managed or native, or at least that's how DbgHelp is designed, I might be wrong, but give it a try first. I'm not aware of anything lower level than DbgHelp.
OK so one thing I'm not clear about...
Can System.Diagnostics.SymbolStore read both C/C++ and .Net PDBs, or is it strictly .Net only? The documentation only mentions .Net but if you look at this you can see many languages represented including C/C++. I think it is using DIA underneath so it makes sense to be able to read C/C++ PDBs too. But so far in my searches I have not been able to determine either way.
BTW, does anyone know if PDBs contain the preprocessor definitions that were used to compile the executable with?