If you are prepared to start calling out to Windows API functions, then GetShortPathName() and GetLongPathName() provide this functionality.
See http://csharparticles.blogspot.com/2005/07/long-and-short-file-name-conversion-in.html
const int MAX_PATH = 255;
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetShortPathName(
[MarshalAs(UnmanagedType.LPTStr)]
string path,
[MarshalAs(UnmanagedType.LPTStr)]
StringBuilder shortPath,
int shortPathLength
);
private static string GetShortPath(string path) {
var shortPath = new StringBuilder(MAX_PATH);
GetShortPathName(path, shortPath, MAX_PATH);
return shortPath.ToString();
}