I prefer recording audio using the waveIn* API functions (waveInOpen etc.). Although this API is old (15+ years) and slightly more difficult to work with than you might like, it can do everything you mention above (except one), doesn't require DirectX at all, and works on every version of Windows going back to Windows 95 (although .Net doesn't work on anything prior to Windows 98), even including Windows Mobile (this last fact blew my mind when I discovered it).
The one thing it doesn't handle is saving to any common, compressed file format (but I don't think recording with DirectSound - the other major option - handles this either). However, there are a number of .Net-compatible libraries out there that can handle this requirement for you (NAudio comes well-recommended, although I've never used it). One of the advantages of recording with waveIn* (the same advantage accrues to DirectSound) is that you record into memory (as opposed to recording direct to a file), so it's easy to do whatever you want with the audio (e.g. save it to a file, strip out the quiet parts, filter it via FFT, alter the format etc.). Many of the .Net-compatible libraries are written to process in-memory buffers instead of or in addition to files, so having your audio always in memory is a big benefit.
Triggering the starting and stopping of recording can be done, although not in the way you might be thinking. With the waveIn* API, you basically start recording from the default audio source, and the API starts filling up memory buffers with recorded sound. You receive a notification as each buffer is filled, and you can then do whatever you like with each buffer. For actually recording to a file, you can simply scan each buffer as it comes in, and if a buffer is empty (contains no audible sound) you simply discard it without writing the contents to a file.
Here is a CodeProject sample that shows how to use both the waveIn* and waveOut* APIs:
http://www.codeproject.com/KB/audio-video/cswavrec.aspx?msg=2137882
I've actually worked with this project before in C#, and it works quite well.