Причина, по которой Unity переносит исключения, заключается в контракте - контракте метода Resolve.
Что должно поймать приложение при броске Resolve? Предположим, вы разрешили класс, который, как вы знаете, выдает IOException. Таким образом, вы помещаете ловушку для этого исключения вокруг вызова разрешения.
Тогда реализация изменится. Или просто конфигурация. Теперь сервисы выбрасывают что-то еще.
Теперь у вас есть изменение конфигурации, которое потребует изменения кода. Не хорошо.
Вторая причина, по которой в упакованном исключении в контейнере есть место для размещения диагностической информации о том, где в процессе разрешения произошла ошибка.