Основная проблема тут, насколько я понимаю, заключается в том, что initrd никак не контачит с загрузчиком. Т.е. загрузчик может эмулировать диск, но это только для себя. Initrd его потом не подцепляет. Должен быть какой-то способ сообщить initrd, что нужно грузится из ISO или с виртуального диска.
Вот например Debian и основанные на нем дистрибутивы имеют такую опцию ядра findiso=$isofile. 100% универсального решения нет. Хотя пора бы уже было бы его изобрести. Например универсальный для всех дистрибутивов параметр для ядра для загрузки с ISO. Но сообщество Linux к сожалению как лебедь, рак и щука. Каждый изобретает свой личный велосипед.
Есть Ventoy. Он конечно классный. Не нужно ломать голову с GRUB и загрузкой в UEFI. Он все делает за тебя. Какими костылами Ventoy грузит дистрибутивы напрямую из ISO, я не знаю. И знать не хочу. Но я не стал ставить его на диск, т.к. при первой установке он удалил бы все данные, а это было рискованной операцией и я не стал это делать. Я поставил Ventoy на флэшку.
Мое решение - распаковать ISO. Оно тоже не совсем универсальное. Некоторые дистрибутивы не кладут в initrd поддержку NTFS. Мол никому не надо. Альт тоже в прошлом не клал и приходилось пересобирать дистрибутивы. Так я собственно и научился их пересобирать. Плюсы моего решения - убирается лишний уровень абстракции, что сильно ускоряет загрузку. Я пока что делаю это только через syslinux. С ним было проще разобраться. Это к сожалению исключает поддержку UEFI. Но через Grub наверное тоже можно. Просто не было времени разобраться.