yes, creating your own WaveStream / IWaveProvider is the way to go. You would pass in a source stream to the constructor, and then in the Read method just read from the section of the source stream you want to. For looping, you would need to reposition the source stream once you have read up to the ned position. Have a look at LoopStream.cs in NAudioDemo to see looping in action. You would just need to change where it repositions to, and how it decides when it has got to the end.
Mark