Right, I forgot to mention what may or may not be obvious: those two DICOM libs have nice C# wrappers and might provide some convenience for dealing with SR structures (which are rather odd), but everything else on your list is do-it-yourself ; -)
However, if you think the DCMTK solves all your needs, then your problem is reduced to making your own C# wrapper, C++/CLI is the way to go, yes it's C++ plus some .NET syntax, but much recommended over SWIG and implicit P/Invoke, those are exercises in pain. Specifically you'll discover issues by runtime crashes instead of having your friendly C++/CLI compiler help you out at compile time.
-thanks