Контейнер хранилище зависимостей. Контейнер служит для разрешения зависимостей, те говорит какую конкретную реализацию подставить. У вас зависимость может быть интерфейс - класс реализация интерфейса, класс - наследник класса, просто класс. Так вот при регистрации вы сопоставляете тип и конкретную его реализацию.
Например
container.Register<IRegisterServer,DbRegisterService>();
container.Register<RegisterVieModel>();
.......
//Конструстор ViewModel
void RegisterViewModel(IRegisterService service)
{
}
Так вот, когда у ioc контейнера вы запрашиваете RegisterViewModel, он смотрит на параметры конструктора и в соответствии с типами в нем зарегистрированными, создаёт и подставляет в конструктор соответствующие типы. Зачем это надо, вы в любой момент можете поменять реализацию или сделать несколько реализаций и регистрировать их в зависимости от параметров запуска или ключей реестра. А вообще инверсия зависимостей служит для избавления кода от связанности. В примере выше, в VM используется не конкретный класс, а некий тип, описанный интерфейсом, если вам надо поменять реализацию, то вы поменяете только строчку реализации, а класс VM останется без изменений. На небольших проектах может и не заметна выгода, но в больших, над которыми несколько человек, даже очень.