Making sure initialization code is executed before other code using Lazy Initialization
Your code does feel like a misuse of lazy evaluation. Some alternative approaches to consider:


MakeInitialize method public and throw if it was not called:

public override void Initialize()
{
    //do stuff
    _isInitialized = true;
}

public void Run()
{
    if(!_isInitialized) throw new InvalidOperationException();
    //do stuff
}


IMHO, it is all-around best option, as it allows you to control when to do initialization. 
Call initialization automatically on every Run call:

protected override void Initialize()
{
    if (_isInitialized) return;
    //do stuff
    _isInitialized = true;
}

public void Run()
{
    Initialize();
    //do stuff
}


This approach is good in some cases. For example, when you have an unstable network connection, it makes sense to check the connection before every method call, and reconnect if needed.
Use Lazy objects to initialize actual services:

public CsvWriter CsvWriter { get { return _csvWriter.Value; } }
readonly Lazy&lt;CsvWriter&gt; _csvWriter;

public void Run()
{
    CswWriter.Write(...)
}


I'm not a fan of lazy initialization, but it is fine, if you use it to instantiate one or two actual services. Laziness is justified in scenarios when there are high chances that Run method will not be called at all by your software.


P.S. Note, that Lazy is thread-safe, while options #1 and #2 are not and require synchronization if thread-safety is required.