The pipeline is doing that to you. The pipeline will "unroll" arrays and collections, but multiple returns are always re-assembled into arrays. The arraylist inside an arraylist works because it only unrolls one level deep, so the first (outer) arraylist got "unrolled" and the second (inner) arraylist got passed through intact.
Try it this way:
Export-Clixml -InputObject $list -Path d:\text.xml