You do not iterate over each item in the file / folder collection, but pass the last value to the channel. You must use the Foreach-item or% for the Copy-Item command. From there, you also don't need a second -recurse switch, since you already have every element in GCI.
try the following:
gci $from -Recurse | % {copy-item -Path $_ -Destination $to -Force -Container }
source
share