So I created this as an Add-In. The bottom part (commented out) was an attempt to copy Column Properties but it didn't work. (This was what I was trying to avoid, but I had a long meeting with nothing better to do...) I'd still be interested if there's something more elegant than this approach.
dt = Current Data Table();
selcol = dt << Get Selected Columns;
selcolname = dt:selcol << Get Name();
newcname = "Copy Of " || selcolname;
newc = dt << New Column( newcname );
newclist = dt:newc << Get Name(); //in case this is a second copy!
movestr = "dt << Move Selected Columns({\!"%newclist%\!"}, After(\!"%selcolname%\!") );";
eval insert into(movestr,"%");
movestrexpr = Parse(movestr);
movestrexpr;
For Each Row(dt:newc = dt:selcol);
/*proplist = dt:selcol << Get Properties List();
for(i=1, i < N Items(proplist), i ++,
currprop = Char(proplist);
gotpropstr = "gotprop = dt:selcol << Get Property(\!"%currprop%\!");";
eval insert into(gotpropstr,"%");
gotpropstrexpr = Parse(gotpropstr);
gotpropstrexpr;
setpropstr = "newc << Eval List(Set Property(\!"%currprop%\!", List(gotprop)));";
eval insert into(setpropstr,"%");
setpropstrexpr = Parse(setpropstr);
setpropstrexpr;
);
newcproplist = dt:newc << Get Properties List();
//Show Properties(dt:selcol);
*/