On Windows, you could execute the following commands and parse the output:
vssadmin list volumes
This gives:
C:\Windows\system32>vssadmin list volumes
vssadmin 1.1 - Volume Shadow Copy Service administrative command-line tool
(C) Copyright 2001-2013 Microsoft Corp.
Volume path: \\?\Volume{66c6160d-60cc-11e3-824b-806e6f6e6963}\
Volume name: \\?\Volume{66c6160d-60cc-11e3-824b-806e6f6e6963}\
Volume path: D:\
Volume name: \\?\Volume{66c6160f-60cc-11e3-824b-806e6f6e6963}\
Volume path: C:\
Volume name: \\?\Volume{66c6160e-60cc-11e3-824b-806e6f6e6963}\
Then Execute
fsutil volume diskfree
Which gives:
C:\Users\MC>fsutil volume diskfree \\?\Volume{66c6160e-60cc-11e3-824b-806e6f6e6963}\
Total # of free bytes : 47826694144
Total # of bytes : 255691059200
Total # of avail free bytes : 47826694144
To read output of a shell process, you can read the standard output
string output = proc.StandardOutput.ReadToEnd();
DISCLAIMER: Yes I know its not exactly the cleanest way, but it is a way. As I'm not aware of an API for accessing such low level info.