I think a transaction filter that prevents or modifies transactions that introduce too-deeply nested lists could do this. You’d also want to set up your interface so that commands that, say, add a new list level are disabled when you are already at level 3.