So the method that Eric posted (using SourceCode.Data.SmartObjectsClient) works, but that is a very ADO-centric way of working with SmartObjects. A simpler way, is to use the SourceCode.SmartObjects.Client assembly. Here is a code sample:
using SourceCode.SmartObjects.Client;
using SourceCode.Hosting.Client.BaseAPI;
//Create a SO Server Client Object
SmartObjectClientServer soServer = new SmartObjectClientServer();
SCConnectionStringBuilder cb = new SCConnectionStringBuilder();
//Build a SC Connection String
cb.Host = "localhost";
cb.Port = 5555;
cb.Integrated = true;
cb.IsPrimaryLogin = true;
//Open the connection to the K2 Server
soServer.CreateConnection();
soServer.Connection.Open(cb.ToString());
//Get a handle to the 'Employee' SO
SmartObject soEmployee = soServer.GetSmartObject("Employee");
//Call the Load Method
soEmployee.MethodToExecute = "Load";
soEmployee.Properties["ID"].Value = "1234";
soServer.ExecuteScalar(soEmployee);
//Read the Properties
string sFirstName = soEmployee.Properties["FirstName"].Value;
string sLastName = soEmployee.Properties["LastName"].Value;
//Example of calling the 'Save' Method
soEmployee.Properties["FirstName"].Value = sFirstName.ToUpper();
soEmployee.Properties["LastName"].Value = sLastName.ToUpper();
soEmployee.MethodToExecute = "Save";
soServer.ExecuteScalar(soEmployee);
//Close the Connection
soServer.Connection.Close();