Exclusive access to objects
What happens if this is called by something that hasn't captured the object?

public void Release()
{
    lock (_lock)
        IsCaptured = false;
}


Honestly, I don't see what this is giving you that you don't get from:

Monitor.TryEnter(lockObj)


and 

Monitor.Exit(lockObj);


Unless you want to release the capture from a different thread, in which case it seems like you're more likely to run into the 'Released by wrong thing` problem.

Why do you need to know if it's captured?  Try to capture the lock and if it fails, you know that it's captured... What purpose does the property really serve?


  The problem here comes when multiple of such object has to be captured at the beginning of method, then it will looks like dozens of nested if/try/finally


If you're going to be capturing groups of objects then you're going to need to be very careful about the order that you capture those objects in order to prevent deadlocks where one method performs:

Capture A, B, C


And another method performs

Capture C, A


One of the things you've indicated is that you don't like the idea of the nested try/finally blocks to ensure that all captured items are released.  You could consider writing some utility functions to help make this cleaner.  Something like this:

static bool TryCaptureAll(params Capturable[] capturables)
{
    List&lt;Capturable&gt; capturedItems = new List&lt;Capturable&gt;();

    foreach(var capturable in capturables)
    {
        if(!capturable.TryCapture())
        {
            // Failed to capture one of the items, release the ones
            // we did capture and return failure.
            foreach(var captured in capturedItems)
            {
                captured.Release();
            }
            return false;
        }

        capturedItems.Add(capturable);
    }

    return true;
}
static void ReleaseAll(params Capturable[] capturables)
{
    foreach (var capturable in capturables)
    {
        capturable.Release();
    }
}


Would allow you to lock and release groups of objects like this:

if (CaptureList.TryCaptureAll(a, b, c))
{
    try
    {
        a.SomeMethod();
        b.SomeMethod();
        c.SomeMethod();
    }
    finally
    {
        CaptureList.ReleaseAll(a, b, c);
    }
}