Jeffery Snover, an Architect on the PowerShell team, has a really good post here.
One thing I find, using PowerShell, is that it's natural to want to have one place to do everything, but the world really works better when you have specialization. PowerShell works really well for me as an integration tool. I often want to do things like threading, create new types, implement interfaces, etc., in PowerShell, but I'm kind of glad I can't.
In general, If I'm going to be writing new code, not integrating existing code, I think PowerShell is the wrong tool for the job. I would rather not have the language and the shell itself encumbered by the fact that people are using it to do things that should really be done in a systems programming language. Think about it: In C#/Visual Studio...I have intellisense, help, unit testing features, syntac highlighting (Code Rush!). That's where I want to write lots of code.
PowerShell is right in the sweet spot for automation and integration. I can go without Visual Studio (though it would be nice!) and TDD, because I'm not writing massive amounts of code in PowerShell. This is my virtuous cycle.
An old boss of mine, Josh McKone used to say, "Make it easy to do good things and hard to do bad things," as hid kind of mantra for API/library design. I think PowerShell hits this mark perfectly.