Ok here's an idea. Retrieve the source data into a dw to give the user enough info to choose the desired rows. The primary key of the chosen rows is inserted in a table in the db. Maybe a global temp table so you don't have to clean it up later. That completes any data traffic being sent between client and server. You then kick off a stored proc (from PB) that uses the primary keys from your "chosen table" as part of the query that inserts rows into the target table. Its not a bcp and the inserts are logged but at least its all done on the server so should be pretty quick. If the user chooses all rows don't write anything to the chosen table and pass a flag to the stored proc letting it know to ignore the chosen table. If you had to you could even create the stored proc on the fly within PB using the 'execute immediate' command. Of course you would want to drop it when finished.
hth,
Mark