Listening for values changed by the memory
Having a private property is quite unusual. It's especially weird since you only use it once in TimerElapsed. I would probably just use the field directly and call RaisePropertyChanged() manually when necessary.
Why is the initial value passed in the constructor? I think the class should retrieve the initial value by itself.
PropertyChanged should be raised for a property that's readable from the outside and the name in the event args should be the same as the name of that property.
Your code is a prime candidate for making it more generic: you could change ValueChange to ValueChange&lt;T&gt; and int _val to T _val. (But if you do this, be careful with equality, !object.Equals(_val, newValue) is probably the simplest way to do it correctly.)

Also, Blah.GetMemoryValue should be configurable by the caller. You could achieve this by accepting a Func&lt;T&gt; delegate in the constructor. Something like:

private readonly Func&lt;T&gt; _getValue;

public ValueChange(double polingInterval, Func&lt;T&gt; getValue)
{
    _getValue = getValue;

     …
}

private void TimerElapsed(object sender, ElapsedEventArgs e)
{
    var newValue = _getValue();

    …
}

I like to avoid null checks on events by making sure there always is at least one subscriber:

public event PropertyChangedEventHandler PropertyChanged = delegate { };


But this is not really a common technique.
Creating multiple timers is okay, they execute on thread pool threads. This means that if several timers tick at the same time, they will be (most likely) executed concurrently by different threads.
In general, polling like this is not ideal. It would be better if you could get a notification whenever the value actually changes. But it seems like this is not possible in your case.
You shouldn't shorten the names of your variables. So, _value is better than just _val.