If you're going to use a single line, you might want to avoid extraneous separator characters when items are empty. Treat each segment as an item in a list, each separated by some separator character. ListBuild() helps accomplish this by outputting the separator sequence in between non-empty items.
So you have 2 items separated by ", ", and one of those items is a list separated by " " and the other by " - ". This means you need 3 listbuilds(). The delimit() function can handle adding the brackets/parens around people/date when people/date is not empty.
listbuild(1, /,/ ,[Caption], listbuild(1, / -/ , listbuild(1, / , [Places], replace(delimit([People], ], [),;,/,)),delimit(formatdate([date,0],dd MMMM yyyy), /), /()))
and that breaks down to:
listbuild(1, /,/ ,
[Caption],
listbuild(1, / -/ ,
listbuild(1, / , [Places], replace(delimit([People], ], [),;,/,)),
delimit(formatdate([date,0],dd MMMM yyyy), /), /()))