To make the most use of space, it might be an option to create a raid-5 with the first 3gb of all 4 drives, then create another raid 5 for the remaining 2gb on the 3 5gb drives and combine both raids in a raid 0 (striped). Expanding the raid 5s would be impossible however, so the only option for expansion is to add a (virtual/physical) device to the parent raid 0.
To try use all drives and still allow expansion, you could split the drives into two groups with a total capacity as equal as possible, create an expandable raid 0 (striped) for each group, and then implement a raid 1 (mirrored) system with the two raid 0 systems. This could even work for raid 5 with 3 or more groups, as long as you can group them appropriately. Expanding this would mean adding a drive to all groups, expanding their raid 0 systems, and then expanding the parent raid to use the new space. While easy on a fundamental level, the last step could prove challenging in practice.
Honestly, this all just sounds like headache. I think your best option is to pair drives of the same size, create a raid 1 (mirror) with each pair, and have an expandable raid 0 (striped) implementation such as ZFS pools to put them into one device. You might not use all the drives, and you can only add two drives at a time, but it's simple, expandable, easy to understand and quite redundant.
Striped/mirrored ZFS pools (https://www.freebsd.org/doc/handbook/zfs-zpool.html)