You can do using a script of some kind (AppleScript, Perl, Python) or a simple command line program. You can also use multiple tables that are configurable like this:

The table "Set Up" (on the right) is for entering the categories and the items in each category. The way things are set up it is better to insert new columns to the left (BEFORE column A).
The table "Information" (on the left) is a quick summary of the entries for use in later steps.
A1=IFERROR(OFFSET(Set up::$A$1, COLUMN()−1, ROW()−1), "")
this is shorthand for... select cell A1, then type (or copy and paste from here) the formula:
=IFERROR(OFFSET(Set up::$A$1, COLUMN()−1, ROW()−1), "")
B1=IF(A1="", "", COUNTA(OFFSET(Set up::$A, 0, MATCH(A1, Set up::$1:$1,0)−1, ROWS(Set up::A), 1))−1)
select A1 and B1, copy
select columns A and B, paste
add a footer row (in this example, then footer row is row 11)
B11=PRODUCT(B)
now let's make the combinations. Create a table called "Combinations" like this:

Make the Combination table (as shown above).
The first two rows are header rows.
B2=OFFSET(Information::$A$1, COLUMN()−2, 0)
B1=VLOOKUP(B2,Information::$A:$B, 2, 0)
select B1 and B2, copy
select cells B1 thru G2, paste
A3=ROW()−2
B3=IF($A3≤Information::$B$11, MOD(INT((ROW()−3)÷PRODUCT(C$1:$G$1)), B$1), "")
select B3, copy
select B3 thru F3, paste
G3=IF(A3≤Information::$B$11, MOD((ROW()−3),G$1), "")
select A3 thru G3, copy
now select row 3 and type the key combination <option> + <down arrow> (to add a new row)
select row 3, copy
select row 4, paste
now select rows 3 and 4, and type the key combination <option> + <down arrow>
now select rows 3 thru 6 and type the key combination <option> + <down arrow>
now select rows 3 thru 10 and type the key combination <option> + <down arrow>
now select rows 3 thru 18 and type the key combination <option> + <down arrow>
now select rows 3 thru 34 and type the key combination <option> + <down arrow>
now repeatedly type the key combination <option> + <down arrow> until there is at least the number of rows shown in Information Table (last row)
If you want to see the actual names for the combinations you can add another table by selecting the table "Combination", then select the menu item "Edit > Duplicate Selection"
Name this new table "List" (or what ever you want):
leave row 2 as is.
B1=MATCH(B2,Set up::$1:$1,0)
select B1, copy
select B1 thru G1, paste
A3=ROW()−2
B3=IF($A3≤Information::$B$11, OFFSET(Set up::$A$2, Combinations::B3, B$1−1), "")
select B3, copy,
select B3 thru G3, paste
select the whole table, then unselect rows 1 and 2 by holding the command key, then click row header 1, then 2, paste