При передаче строки, роутер сначала посмотрит, имеется ли в контейнере такой объект, и если имеется, то вернет его. Если нет, попытается интерпретировать строку как имя контроллера с экшеном и создаст новый экземпляр.
Во втором случае в конструктор контроллера будет передан сам контейнер, из которого вы можете получить доступ к View.
В свою очередь, если вы создадите объект в контейнере так
$container['\App\Controllers\Homecontroller'] = ...
то эта запись должна работать
$app->get('/home', '\App\Controllers\Homecontroller:home');
По идее, контроллеры можно и не включать в контейнер вовсе, а доступ к зависимостям получать через переданный контейнер
public function __construct($c) {
$this->container = $c;
$this->container->get('view');
}
Но это спорный вопрос.