Charcoal, 27 2323 18 bytes
≔EX²N↨⁴↨ι²υIE⊗υ⁺ιυ
Try it online! Link is to verbose version of code. Explanation: Now a port of @tsh's Python answer.
≔EX²N↨⁴↨ι²υ
Map the numbers up to 2ⁿ by converting them to base 2 and then interpreting the result as base 4.
IE⊗υ⁺ιυ
Vectorised add the doubled array to itself as a matrix.
Previous 27 23 byte answer uses a different approach that is interesting in its own right because some golfing languages have built-ins for things like group index by value or sort array by key.
≔EX⁴N↨²÷↨ι⁴¦²υIE⊕⌈υ⌕Aυι
Try it online! Link is to verbose version of code. Explanation:
≔EX⁴N↨²÷↨ι⁴¦²υ
For each element in the final diagram, convert it to base 4, halve the digits, then convert from base 2. This gives the row number for that element.
IE⊕⌈υ⌕Aυι
For each row list the elements assigned to that row.