the way I see it, you have 2 options - Pushing and Pulling.
Pulling, is basically where the client application periodically checks with the server to see if there have been any updates. If there have, you refresh your dataset. The biggest problem with this, is losing the users changes - you could always ask if they want to update thier data, or even pull back a refreshed list and compare it to their own.
Pushing is the opposite, in that the server pushes any changes down to the client. You still have the same issues, except that you don't have to go polling the database all the time to see if changes have been made.
Have you considered using something like MIDAS with ClientDataSets??? MIDAS has some built-in functionality to handle all of this stuff (its still fiddly tho), including the ability to return data indicating where conflicts have occurred.
Other than this, you could always implement your own middle-tier which can send updates down to your client apps. Your client apps would need to know how to handle said updates tho. Same old problem.