I see many good resources here, but most are focused on reading and study material. While these are definately essential, I find that they don't really click until I have actually used a pattern or hueristic or concept or whatever one or more times.
Because of this I would recommend the reading but when you sit down to code start working with NUnit and practicing TDD (or BDD, etc). This will help you to do two things.
It will pressure you to decouple your classes. It is hard to really test code with many dependencies. If you want to really get in there and write tests you will need to decouple. This is a good place to start applying all the recommened reading. :)
TDD will help you to think about how you want to interact with your code before you even write it. I find that thinking about a design abstractly is different from actually coding the interface from the outside, and the latter is more useful in fitting the pieces together.