Most of the failed outsource attempts I know of are one way or another due to non-technical team members attempting to lead technical teams. That a developer could lead another developer, or team of developers, down the right path sooner, more efficiently, and for a longer duration, makes perfect sense. In practice, it's worked brilliantly for the teams I've worked with.
Even still, it takes a special kind of developer to successfully outsource development work. It's not sufficient to simply push work over a wall and accept whatever comes back. Things like well defined requirements, frequent code reviews, detailed mockups, and clearly stated user stories are critical, b/c when you outsource work, the default regresses from what you'd normally expect to substandard work.
But, that's not always due to the outsourced team. Often times its on the hiring party to identify what they need to do better. Great results start with great teams, and part of being a great team is understanding that accountability for the overall result flows both ways.