There's a pretty good explanation at wikipedia:
http://en.wikipedia.org/wiki/Dependency_injection
But the basic idea is that instead of creating or directly referencing some external object, your code asks for the dependency to be provided by the IoC container. This introduces a layer of indirection, which makes it easy to change what is given to the object when it asks for a dependency. So you can swap out implementations, dynamically determine what the IoC container provides, or even use a different IoC configuration in different environments (test vs. production, for example).
Finally, you can inject any dependency into any class, so you aren't limited to just the places Sencha provides lookup properties (like store name).