There are a few optimizations I can think of.
First off, in your GetFeature method, you create a new cursor every time. Cursor take a lot of processing. Re-using the cursor might give you a performance boost. That would also avoid having to release it every time.
I also notice you keep all the fields. You can stream line your cursors by defining the subfield of a query filter to be only the objectid and the shape field, the where clause can be empty.
In GetFeatures, you search all the features and do a relational operation, you could do a spatialfilter query instead and get only features that overlap returned.
If it is possible memory-wise, you could build a dictionary or two dimensional array with the objectId and shape for the IcheckLayer by cursoring through them once to build the dictionary, then you could loop through the dictionary instead.
Finally, you can look at the Overlay toolbox in the analysis tools. Intersect, for example, will keep all the overlaping sections of both featureclasses with the attributes from both. You could get the output features and get the objectid of both original featrures.