Programming to interfaces is core OO principle. It enables you to build in Dependency inversion/inversion of control
- ie implementations don't directly depend on other implementations - instead, they depend on other Types . What this does is make it easy to plug in/plug out parts of your system. It also enhances testability of the system, since its easy to provide mocks conforming to an interface if all your implementation cares about is the interface.
Also, having a system described in terms of a few interfaces also makes it easier to understand the overall policies of the system. Trying to divine this from a bunch of base classes that have implementation details just makes it a little more harder.
Abstract base classes are really nothing more than a way to share implementation that is common between multiple subclasses. But beware of avoiding the interface and directly binding to an abstract base class - what you're doing by that is setting in stone that you not only bind to the interface of the abstract base, but will also always carry around the implementation. There are many times when what seems like a given today is turned around 180 degrees in a few months/years and this the kind of 'permanent' decision that you shouldn't take lightly. The cost of always having an interface is much less, in my opinion.
So in effect, have an interface to document a Type, and if among the implementors of the type you see a lot of potential code reuse, create an abstract base that inherits from the interface. THe abstract base could also introduce pure virtual hook methods that are really the implementation details that and provide convenience and code reuse.
Finally, you might be frustrated if your interfaces arent right - in that case, they just make things harder (ie you have all the additional work of interfaces and none of the advantages and then they feel plain wrong) - but given by what you're saying, this doesn't look like to be the case.
Full disclosure - I'm not a .NET developer. I'm a java/python developer though I have decent exposure to .NET. There's far more .NET developers at my workplace than Java devs - and we have these discussions quite a bit. As an aside, I find this sentiment that interfaces are overused more prevalent in the .NET world rather than among Java devs - but that's just my perspective.