I'm trying to create an image to boot a PC Engines' APU2, which uses coreboot. The debugging is particularly funny as I don't have a usb to serial converter to see what's going on -_-. I've used the following properties:

    laptop :: Host
    laptop = host "laptop" $ props
        & osDebian Unstable X86_64
        ...
        & imageBuiltFor router
            (RawDiskImage "/srv/router.img")
            (Chroot.Debootstrapped mempty)

    router :: Host
    router = host "router" $ props
        & hasPartitionTableType GPT
        & hasPartition
            ( partition EXT2
                `mountedAt` "/boot"
                `partLocation` Beginning
                `setSize` MegaBytes 150
            )
        & hasPartition
            ( partition EXT4
                `mountedAt` "/"
                `addFreeSpace` MegaBytes 500
            )
        & osDebian (Stable "stretch") X86_64
        & Apt.installed ["linux-image-amd64"]
        & serialGrub
        ...
      where
        serialGrub :: Property (HasInfo + DebianLike)
        serialGrub = "/etc/default/grub" `File.containsLines`
                [ "GRUB_CMDLINE_LINUX=\"console=ttyS0,115200n8 biosdevname=0\""
                , "GRUB_SERIAL_COMMAND=\"serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1\""
                , "GRUB_TERMINAL=serial"
                ]
                -- `onChange` Grub.mkConfig
                `requires` Grub.installed Grub.Coreboot
                `describe` "GRUB configured for PC Engines' APU2 serial console"

This returns:
    
    $ propellor --spin laptop
    ...
    router no services started ... ok
    router has partition table type GPT ... ok
    router has has /boot partition ... ok
    router has has / partition ... ok
    router has Operating System (Debian Linux (Stable "stretch")) X86_64 ... ok
    ...
    router apt installed linux-image-amd64 ... ok
    Reading package lists...
    Building dependency tree...
    Reading state information...
    The following additional packages will be installed:
      gettext-base grub-common grub-coreboot-bin grub2-common libfreetype6
      libfuse2 libpng16-16 os-prober
    Suggested packages:
      multiboot-doc grub-emu xorriso desktop-base console-setup fuse
    The following NEW packages will be installed:
      gettext-base grub-common grub-coreboot grub-coreboot-bin grub2-common
      libfreetype6 libfuse2 libpng16-16 os-prober
    0 upgraded, 9 newly installed, 0 to remove and 0 not upgraded.
    Need to get 4354 kB of archives.
    After this operation, 20.9 MB of additional disk space will be used.
    Get:1 http://deb.debian.org/debian stretch/main amd64 libpng16-16 amd64 1.6.28-1 [280 kB]
    Get:2 http://deb.debian.org/debian stretch/main amd64 libfreetype6 amd64 2.6.3-3.2 [438 kB]
    Get:3 http://deb.debian.org/debian stretch/main amd64 libfuse2 amd64 2.9.7-1 [125 kB]
    Get:4 http://deb.debian.org/debian stretch/main amd64 gettext-base amd64 0.19.8.1-2 [121 kB]
    Get:5 http://deb.debian.org/debian stretch/main amd64 grub-common amd64 2.02~beta3-5 [2174 kB]
    Get:6 http://deb.debian.org/debian stretch/main amd64 grub2-common amd64 2.02~beta3-5 [526 kB]
    Get:7 http://deb.debian.org/debian stretch/main amd64 grub-coreboot-bin amd64 2.02~beta3-5 [587 kB]
    Get:8 http://deb.debian.org/debian stretch/main amd64 grub-coreboot amd64 2.02~beta3-5 [73.0 kB]
    Get:9 http://deb.debian.org/debian stretch/main amd64 os-prober amd64 1.76~deb9u1 [30.0 kB]
    Preconfiguring packages ...
    E: Can not write log (Is /dev/pts mounted?) - posix_openpt (19: No such device)
    Fetched 4354 kB in 1s (2803 kB/s)
    Selecting previously unselected package libpng16-16:amd64.
    (Reading database ... 26264 files and directories currently installed.)
    Preparing to unpack .../0-libpng16-16_1.6.28-1_amd64.deb ...
    Unpacking libpng16-16:amd64 (1.6.28-1) ...
    Selecting previously unselected package libfreetype6:amd64.
    Preparing to unpack .../1-libfreetype6_2.6.3-3.2_amd64.deb ...
    Unpacking libfreetype6:amd64 (2.6.3-3.2) ...
    Selecting previously unselected package libfuse2:amd64.
    Preparing to unpack .../2-libfuse2_2.9.7-1_amd64.deb ...
    Unpacking libfuse2:amd64 (2.9.7-1) ...
    Selecting previously unselected package gettext-base.
    Preparing to unpack .../3-gettext-base_0.19.8.1-2_amd64.deb ...
    Unpacking gettext-base (0.19.8.1-2) ...
    Selecting previously unselected package grub-common.
    Preparing to unpack .../4-grub-common_2.02~beta3-5_amd64.deb ...
    Unpacking grub-common (2.02~beta3-5) ...
    Selecting previously unselected package grub2-common.
    Preparing to unpack .../5-grub2-common_2.02~beta3-5_amd64.deb ...
    Unpacking grub2-common (2.02~beta3-5) ...
    Selecting previously unselected package grub-coreboot-bin.
    Preparing to unpack .../6-grub-coreboot-bin_2.02~beta3-5_amd64.deb ...
    Unpacking grub-coreboot-bin (2.02~beta3-5) ...
    Selecting previously unselected package grub-coreboot.
    Preparing to unpack .../7-grub-coreboot_2.02~beta3-5_amd64.deb ...
    Unpacking grub-coreboot (2.02~beta3-5) ...
    Selecting previously unselected package os-prober.
    Preparing to unpack .../8-os-prober_1.76~deb9u1_amd64.deb ...
    Unpacking os-prober (1.76~deb9u1) ...
    Setting up libpng16-16:amd64 (1.6.28-1) ...
    Setting up libfuse2:amd64 (2.9.7-1) ...
    Setting up gettext-base (0.19.8.1-2) ...
    Setting up libfreetype6:amd64 (2.6.3-3.2) ...
    Processing triggers for libc-bin (2.24-11+deb9u1) ...
    Setting up grub-common (2.02~beta3-5) ...
    Setting up grub2-common (2.02~beta3-5) ...
    Setting up os-prober (1.76~deb9u1) ...
    Setting up grub-coreboot-bin (2.02~beta3-5) ...
    
    Creating config file /etc/default/grub with new version
    Setting up grub-coreboot (2.02~beta3-5) ...
    router GRUB configured for PC Engines' APU2 serial console ... ok
    loop deleted : /dev/loop0
         25,091,167 100%  194.29MB/s    0:00:00 (xfr#4, to-chk=0/5)
        769,633,861  99%   26.74MB/s    0:00:27 (xfr#26204, to-chk=0/33524)   
    update-initramfs: Generating /boot/initrd.img-4.9.0-4-amd64
    /usr/sbin/grub-mkconfig: 253: /usr/sbin/grub-mkconfig: cannot create /boot/grub/grub.cfg.new: Directory nonexistent
    loop deleted : /dev/loop0
    laptop built disk image /srv/router.img ... failed
    laptop overall ... failed

So, grub-mkconfig seems to be run without /boot/grub existing, which I can confirm by looking into /srv/router.img.chroot/boot/:

    $ ls /srv/router.img.chroot/boot/
    config-4.9.0-4-amd64      initrd.img-4.9.0-4-amd64  System.map-4.9.0-4-amd64  vmlinuz-4.9.0-4-amd64

