«Реализация слоя-обертки с замками» - путь.
Уровень оболочки, скорее всего, будет использовать блокировку, которая зависит от того, как ваше приложение использует DataSets.
Попытка разработать общее решение для такого сложного класса, как DataSet, вероятно, обречена на провал.
Например, перечисление свойств, как правило, не будет потокобезопасным, поэтому вам нужно будет удерживать блокировку до тех пор, пока любой вызывающий объект перечисляет любое из множества свойств коллекции (DataSet.Tables, DataTable.Rows, ... ).