More prodding about produced this, which seems to work.
The tip came from this old stackoverflow question, I'm still confused about what's going on though
Code:
#!/bin/sh
cmd="cdialog --menu 'Hello World' 10 40 9 "
list="I am Label|I am Text
hello world|foo bar"
IFS="
"
for arg in ${list}; do
label=$(echo ${arg} | cut -d '|' -f 1)
text=$(echo ${arg} | cut -d '|' -f 2)
cmd="${cmd} '${label}' '${text}'"
done
#echo ${cmd}
eval ${cmd}