C# Am I using proper SOLID principles?
I suppose the simplest thing is to go through the principles:

SRP - Cannot see any 'too big' things in your example
OCP - The example is small enough and you are not using class
inheritance that I cannot think of how this would apply
LSP - You only have one implementation of each interface so hard to
say
ISP - Your interfaces seem to serve a single purpose that might serve
the needs of several users - so no complaints there
DIP - You have pushed the more variable 'decision' making out,
keeping the API more abstract which seems reasonable.

Much of this, of course, depends on your specific aims and requirements. some thoughts:

How likely is it that the mapper and reader will vary independently?
Are you going to get any reuse out of all the different readers and mappers (actual not future-proofing)
Will each reader have a mapper in practice, in which case your comment about combining the mapper and reader is worth more thought.
Do you really need an interface for the reader, it seems like you are just wrapping what could be a function/lambda
What is the motivation in restricting the outbound data?
I appreciate this may just be an exercise, but it's good practice to think if you need to do this kind of restriction

It can be difficult to have a good instinct for principles like SOLID on toy problems due to the lack of realistic constraints and compromises.