I can't speak to the first part of your question, because I haven't mucked around with shell extensions. But file:///C:/C%23
is the correct Url for the directory C:\C#
, with urlencoding applied. If you want to turn this string into a filesystem path, you can do something like this:
var uri = new Uri("file:///C:/C%23");
var path = Uri.LocalPath;